Expand description
Chrono-TZ 0.4.1
Chrono-TZ
is a library that provides implementors of the
TimeZone
trait for rust-chrono
. The
impls are generated by a build script using the IANA database
and zoneinfo_parse
.
Usage
Put this in your Cargo.toml
:
[dependencies]
chrono = "0.4"
chrono-tz = "0.4"
If you want Serde support, specify it like this:
chrono-tz = { version = "0.4", features = ["serde"] }
Then you will need to write (in your crate root):
extern crate chrono;
extern crate chrono_tz;
Examples
Create a time in one timezone and convert it to UTC
use chrono::{TimeZone, Utc};
use chrono_tz::US::Pacific;
let pacific_time = Pacific.ymd(1990, 5, 6).and_hms(12, 30, 45);
let utc_time = pacific_time.with_timezone(&Utc);
assert_eq!(utc_time, Utc.ymd(1990, 5, 6).and_hms(19, 30, 45));
Create a naive datetime and convert it to a timezone-aware datetime
use chrono::{TimeZone, NaiveDate};
use chrono_tz::Africa::Johannesburg;
let naive_dt = NaiveDate::from_ymd(2038, 1, 19).and_hms(3, 14, 08);
let tz_aware = Johannesburg.from_local_datetime(&naive_dt).unwrap();
assert_eq!(tz_aware.to_string(), "2038-01-19 03:14:08 SAST");
London and New York change their clocks on different days in March so only have a 4-hour difference on certain days.
use chrono::TimeZone;
use chrono_tz::Europe::London;
use chrono_tz::America::New_York;
let london_time = London.ymd(2016, 3, 18).and_hms(3, 0, 0);
let ny_time = london_time.with_timezone(&New_York);
assert_eq!(ny_time, New_York.ymd(2016, 3, 17).and_hms(23, 0, 0));
Adding 24 hours across a daylight savings change causes a change in local time
use chrono::{TimeZone, Duration};
use chrono_tz::Europe::London;
let dt = London.ymd(2016, 10, 29).and_hms(12, 0, 0);
let later = dt + Duration::hours(24);
assert_eq!(later, London.ymd(2016, 10, 30).and_hms(11, 0, 0));
And of course you can always convert a local time to a unix timestamp
use chrono::TimeZone;
use chrono_tz::Asia::Kolkata;
let dt = Kolkata.ymd(2000, 1, 1).and_hms(0, 0, 0);
let timestamp = dt.timestamp();
assert_eq!(timestamp, 946665000);
Pretty-printing a string will use the correct abbreviation for the timezone
use chrono::TimeZone;
use chrono_tz::Europe::London;
let dt = London.ymd(2016, 5, 10).and_hms(12, 0, 0);
assert_eq!(dt.to_string(), "2016-05-10 12:00:00 BST");
assert_eq!(dt.to_rfc3339(), "2016-05-10T12:00:00+01:00");
You can convert a timezone string to a timezone using the FromStr trait
use chrono::TimeZone;
use chrono_tz::Tz;
use chrono_tz::UTC;
let tz: Tz = "Antarctica/South_Pole".parse().unwrap();
let dt = tz.ymd(2016, 10, 22).and_hms(12, 0, 0);
let utc = dt.with_timezone(&UTC);
assert_eq!(utc.to_string(), "2016-10-21 23:00:00 UTC");
If you need to iterate over all variants you can use the TZ_VARIANTS array
use chrono_tz::{TZ_VARIANTS, Tz};
assert!(TZ_VARIANTS.iter().any(|v| *v == Tz::UTC));
Modules
Enums
TimeZones built at compile time from the tz database
Constants
Statics
An array of every known variant
Traits
Detailed timezone offset components that expose any special conditions currently in effect.
Timezone offset name information.